package com.devMode.Singleton;

/**
 * 单例模式 -- 双重检测
 */
public class DoubleCheckSingleton {
    /**
     * volatitle 为了防止new的时候指令重排
     * 可能会先把指针指向分配好的地址，再初始化  ---  这种情况判断不为空
     * 可能会先在分配好的地址完成初始化的操作，再把指针指向该地址  --- 这种情况判断为空
     * 在高并发的时候，有可能一个线程不知道另外一个线程正在初始该类
     * 它可能看到指针为空（实际上另外一个线程正在初始化中，只是没有把指针指向该内存而已）
     * 从而导致重复初始化该类，导致单例失效。
     */
    private volatile static DoubleCheckSingleton instance;

    /**
     * 私有化构造方法，禁止外部new方法的调用
     */
    private DoubleCheckSingleton(){

    }

    public static DoubleCheckSingleton getInstance(){
        if(instance==null){
            synchronized (DoubleCheckSingleton.class){
                if(instance == null){
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}
